package br.edu.universo.si.projeto2.infojob.server;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Padrão SINGLETON
 * Provê conexão com o banco de dados;
 * @author Andrey A. de Oliveira
 */
public class Database
{
	// ********************************* ALTERE AKI OS DADOS PARA CONEXAO COM O BANCO
	private static final String DATABASE_USERNAME = "postgres";
	private static final String DATABASE_PASSWORD = "postgres";
	private static final String DATABASE_IP_ADDRESS = "127.0.0.1";
	private static final String DATABASE_NAME = "db_teste";
	private static final String DATABASE_PORT = "5432";
	// ******************************************************************************

	private static final Database instance = new Database(); // singleton

	private Database()
	{
		try
		{
			// carrega o driver apenas uma vez!
			Class.forName("org.postgresql.Driver");
		}
		catch (ClassNotFoundException ex)
		{
			ex.printStackTrace();
			System.err.println(ex.toString());
		}
	}

	/**
	 * Retorna uma instância da própria classe.
	 * @author Andrey A. de Oliveira
	 * @return Database : uma instância da classe.
	 */
	public static Database getInstance()
	{
		return instance;
	}

	/**
	 * Cria uma nova conexão com o Banco de Dados.
	 * @author Andrey A. de Oliveira
	 * @return Connection : objeto de conexão com o banco.
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException
	{
		Connection con = DriverManager.getConnection("jdbc:postgresql://" + DATABASE_IP_ADDRESS + ":" +
				DATABASE_PORT + "/" + DATABASE_NAME , DATABASE_USERNAME, DATABASE_PASSWORD);

		return con;
	}

	/**
	 * Cria um statement.
	 * @author Andrey A. de Oliveira
	 * @return Statement
	 * @throws SQLException
	 */
	public Statement getStatement() throws SQLException
	{
		Statement stmt = getConnection().createStatement();
		
		return stmt;
	}

	/**
	 * Cria um PreparedStatement a partir de um comando SQL passado.
	 * @author Andrey A. de Oliveira
	 * @param SQL : o comando SQL a ser executado.
	 * @return PreparedStatement
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public PreparedStatement getPreparedStatement(String SQL) throws ClassNotFoundException, SQLException
	{
		PreparedStatement pStmt = getConnection().prepareStatement(SQL);
		return pStmt; 
	}

	/**
	 * Cria um PreparedStatement para controle transacional.
	 * @author Andrey A. de Oliveira
	 * @param conn : objeto de conexão com o banco.
	 * @param SQL : comando SQL.
	 * @return PreparedStatement
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public PreparedStatement getPreparedStatement(Connection conn, String SQL)
		throws ClassNotFoundException, SQLException
	{
		PreparedStatement pStmt = conn.prepareStatement(SQL);
		return pStmt;
	}
}